#pragma once
#include <Rz/IObject.h>

namespace Rz {

#define RZ_TYPEWRAPPER_IMPLEMENT(T)													\
typedef typename ITypeWrapper<T>::ValueType					ValueType;				\
typedef typename ITypeWrapper<T>::SizeType					SizeType;				\
typedef typename ITypeWrapper<T>::PointerDifferenceType		PointerDifferenceType;	\
typedef typename ITypeWrapper<T>::Pointer					Pointer;				\
typedef typename ITypeWrapper<T>::ConstPointer				ConstPointer;			\
typedef typename ITypeWrapper<T>::Reference					Reference;				\
typedef typename ITypeWrapper<T>::ConstReference			ConstReference;
    
template <typename T>
class ITypeWrapper :
	virtual public IObject
{
	public:
		RZ_RTTI_INTERFACE(Rz, ITypeWrapper);
		RZ_RTTI_IMPLEMENTS(IObject);
		RZ_RTTI_TEMPLATES(NonObjectType<T>);
		RZ_RTTI_END;

		typedef T					ValueType;
		typedef size_t				SizeType;
		typedef ptrdiff_t			PointerDifferenceType;
		typedef T*					Pointer;
		typedef const T*			ConstPointer;
		typedef T&					Reference;
		typedef const T&			ConstReference;

		static const SizeType NoPosition = static_cast<SizeType>(::Rz::NoPosition);
};

}
